Computer systems perform wide-ranging tasks in today's world, to say the least. In performing many of these tasks, computers are called upon to determine the condition of and control external devices. These external devices may be of many different types, including sensors, clocks, actuators, disk drives and motors to name just a few.
A computer typically interacts with external devices by executing a software program that calls for the computer to generate signals that control certain of the devices based on the condition of other of the devices. For example, a computer may adjust the speed of a motor based on the temperature of a fluid that the motor is stirring and the length of time that the motor has been stirring the fluid.
When computers began to be called upon to sense and control external devices, a method called “polling” was developed. Polling calls for the computer actively to query the external devices to determine their condition, usually periodically. In the example above, the computer may poll a thermometer and a clock once a second to determine the fluid temperature and time. While effective for simple tasks involving a relatively small number of devices, polling came to consume ever-greater amounts of the computer's time as the tasks and the numbers of devices became more complex. Polling is inefficient, because the computer must poll even when no conditions requiring the computer's response have occurred. At its extreme, polling may even consume so much time that the computer is precluded from performing other tasks.
To overcome the disadvantages inherent in polling, “interrupts” were developed. With interrupts, the computer does not actively determine the condition of external devices. Instead, changes in device condition (“events”) cause signals (“interrupts”) to be delivered to the computer, often by way of an “interrupt register,” or “alarm register,” that contains status information regarding its corresponding external device. The computer is free to execute its software program until it receives an interrupt, at which time it usually departs from its program and responds to, or “handles,” the interrupt, often based on the contents of one or more interrupt registers.
Interrupts are widely used today, but they are by no means a perfect solution by themselves. Interrupt handling becomes complex when a computer is called upon to sense and control a great number of external devices, such as may be encountered in a telecommunications or computer network. It becomes more complex when combinations of events trigger different responses by the computer. It becomes still more complex when the events and combinations change depending upon the software instructions that the computer is executing when the events or combinations occur. Combinations of interrupt conditions have become so complex that they are now often organized into a “hierarchical register consolidation structure” to ease their management. Management of the hierarchical register consolidation structure may be performed by a condition management system, or CMS.
Creating a suitable hierarchical register consolidation structure for a system of external devices, however, remains a time-consuming challenge. When a new system is designed, its microprocessor-accessible registers, node interrelationships and summary bits and masks associated with its alarm registers are currently carefully, manually organized into a register consolidation structure that is traversable as a mathematical tree. Systems having many thousands of such registers, interrelationships, summary bits and masks can render the process extremely tedious and exceedingly error-prone. Creating, testing and correcting errors in manually produced hierarchical register consolidation structures takes significant development time and money and can significantly complicate and delay the introduction of new systems. What is needed in the art is a faster, more accurate way to create a hierarchical register consolidation structure.